package main

import "fmt"

func main() {
	/*
				// channe用于多个goroutine之间通信
				// 创建channel
				// 需要指定通道中存储的数据类型，指定大小
				ch := make(chan int, 3)
				// fmt.Printf("ch=%v，类型：%T\n", ch, ch)
				// 发送数据
				ch <- 100
				ch <- 200
				ch <- 300
				// 从通道中读取数据(每次读取一个)，先进先出
				a := <-ch // 100
				fmt.Println(a)
				// <-ch              // 200 取出后不使用
				// fmt.Println(<-ch) // 300
				// 获取通道的长度和容量
				// fmt.Println(len(ch), cap(ch))

				// 通道是引用类型
				ch1 := make(chan int, 3)
				ch1 <- 23
				ch1 <- 34
				ch1 <- 55
				// 拷贝一份ch1的地址
				ch2 := ch1
				fmt.Println(<-ch2)
				fmt.Println(<-ch2)
				// ch2和ch1两者共享同一个通道
				fmt.Println("ch1长度：", len(ch1))

			ch3 := make(chan string, 1)
			ch3 <- "hello"
			// fmt.Println(len(ch3))
			// 通道阻塞：如果通道已经满了，再存放回出现
			// fatal error: all goroutines are asleep - deadlock!
			<-ch3
			ch3 <- "小明"

		ch1 := make(chan int, 3)
		ch1 <- 23
		ch1 <- 34
		ch1 <- 55
		// 遍历通道，获取出每一个值
		// for i := 0; i < 3; i++ {
		// 	fmt.Println(<-ch1)
		// }
		close(ch1) // 关闭通道
		// for range 通道中是没有键
		// 必须是关闭的通道
		for value := range ch1 {
			fmt.Println(value)
		}
	*/
	ch := make(chan int, 3)
	ch <- 20
	num, ok := <-ch
	// num 从中取出的值，ok是否有值
	fmt.Println(num, ok)

}
